package top.cardone.context.util;

import org.apache.commons.lang3.ArrayUtils;
import org.springframework.util.StringUtils;
import top.cardone.context.ApplicationContextHolder;
import top.cardone.context.i18n.LocaleContextHolder;
import top.cardone.core.util.func.Func1;

import java.util.Locale;

/**
 * 消息工具类
 *
 * @author yao hai tao
 */
public class MessageUtils {
    private MessageUtils() {
    }

    /**
     * 获取消息
     *
     * @param code           代码
     * @param defaultMessage 默认消息
     * @return 消息
     */
    public static String getMessage(String code, String defaultMessage) {
        return getMessage(code, null, defaultMessage);
    }


    /**
     * 获取消息
     *
     * @param code           代码
     * @param args           参数
     * @param defaultMessage 默认消息
     * @return 消息
     */
    public static String getMessage(String code, Object[] args, String defaultMessage) {
        if (ApplicationContextHolder.getApplicationContext() == null) {
            return null;
        }

        return getMessage(code, args, defaultMessage, LocaleContextHolder.getLocale());
    }

    /**
     * 获取消息
     *
     * @param code           代码
     * @param args           参数
     * @param defaultMessage 默认消息
     * @param locale         时区
     * @return 消息
     */
    public static String getMessage(String code, Object[] args, String defaultMessage, Locale locale) {
        if (ApplicationContextHolder.getApplicationContext() == null) {
            return null;
        }

        if (org.apache.commons.lang3.StringUtils.isBlank(defaultMessage)) {
            if (ArrayUtils.isEmpty(args)) {
                defaultMessage = code;
            } else {
                defaultMessage = org.apache.commons.lang3.StringUtils.join(args);
            }
        }

        return ApplicationContextHolder.getApplicationContext().getMessage(code, args, defaultMessage, locale);
    }

    /**
     * @param code           代码
     * @param args           参数
     * @param defaultString  默认字符
     * @param readFuncBeanId 读取方法beanId
     * @return 字符串
     */
    public static String getMessage(String code, Object[] args, String defaultString, String readFuncBeanId) {
        String value = ApplicationContextHolder.func(Func1.class, func -> (String) func.func(code), readFuncBeanId);

        return getMessage(value, code, args, defaultString);
    }

    /**
     * 转换为消息
     *
     * @param message        消息
     * @param code           代码
     * @param args           参数
     * @param defaultMessage 默认消息
     * @return 消息
     */
    public static String getMessage(String message, String code, Object[] args, String defaultMessage) {
        Locale locale = LocaleContextHolder.getLocale();

        if (!StringUtils.isEmpty(message)) {
            return MessageFormatUtils.getMessageFormat(message, locale).format(args);
        }

        return getMessage(code, args, defaultMessage, locale);
    }
}